package com.secbro.drools.config;

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import java.io.IOException;

@Configuration
public class DroolsAutoConfiguration {

	private static final String RULES_PATH = "com/rules/";

	@Bean
	@ConditionalOnMissingBean(KieFileSystem.class)
	public KieFileSystem kieFileSystem() throws IOException {
		KieFileSystem kieFileSystem = KieServices.Factory.get().newKieFileSystem();
		for (Resource file : getRuleFiles()) {
			kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
		}
		return kieFileSystem;
	}

	private Resource[] getRuleFiles() throws IOException {
		ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
		return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
	}

	@Bean
	@ConditionalOnMissingBean(KieContainer.class)
	public KieContainer kieContainer() throws IOException {
		KieServices kieServices = KieServices.Factory.get();

		final KieRepository kieRepository = kieServices.getRepository();

		kieRepository.addKieModule(kieRepository::getDefaultReleaseId);

		KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
		kieBuilder.buildAll();

		return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
	}

//	private KieServices getKieServices() {
//		return KieServices.Factory.get();
//	}

//	@Bean
//	@ConditionalOnMissingBean(KieBase.class)
//	public KieBase kieBase() throws IOException {
//		return kieContainer().getKieBase();
//	}

	@Bean
	@ConditionalOnMissingBean(KieSession.class)
	public KieSession kieSession() throws IOException {
		return kieContainer().newKieSession();
	}

//	@Bean
//	@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
//	public KModuleBeanFactoryPostProcessor kiePostProcessor() {
//		return new KModuleBeanFactoryPostProcessor();
//	}
}